﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using EFDataModel;
using EFDataModel.Enums;
using GlobalResources;
using Resources;

namespace ContactManagement.Models.DynamicData
{
    /// <summary>
    /// Aufbau des Models für das Erstellen eines Dynamischen Datentyps. Hier werden nur die Basistypen abgefragt.
    /// Der Typ und das Modul kann nur hier festgelegt werden und nicht mehr geändert werden, wenn der Datentyp bearbeitet wird.
    /// </summary>
    public class DynamicDataAddModel
    {
        /// <summary>
        /// Der Name des Eingabefeldes
        /// </summary>
        [Display(Name = "DynamicDataNameRESX", ResourceType = typeof(AdminViews))]
        [StringLength(50, MinimumLength = 1)]
        [Required]
        public string Name { get; set; }

        /// <summary>
        /// SPÄTER NICHT MEHR BEARBEITBAR, wenn einmal angelegt.
        /// Die ausgewählte ModulId für den aktuellen Dynamischen Datentyp, gehört zur Liste mit den Modules
        /// </summary>
        [Required]
        public int ModulId { get; set; }

        /// <summary>
        /// Die zur Verfügung stehenden Module für die der Dynamische Datentyp angelegt werden soll
        /// </summary>
        [Display(Name = "ModuleNameRESX", ResourceType = typeof(AdminViews))]
        public IEnumerable<SelectListItem> Modules
        {
            get
            {
                //Aus dem Enum mit den Modulen die passenden Listenteinträge machen
                List<SelectListItem> items = new List<SelectListItem>();
                foreach (string value in Enum.GetNames(typeof(EFModules)))
                {
                    //Das aktuelle Item "heraussuchen"
                    EFModules currentItem = (EFModules)Enum.Parse(typeof(EFModules), value);

                    //Jedes Eingabefeld muss einem Modul zugewiesen sein, daher wird None auch nicht in der Auflistung angezeigt.
                    if (currentItem == EFModules.None)
                    {
                        continue;
                    }

                    items.Add(new SelectListItem { Value = ((int)currentItem).ToString(), Text = EFBase.GetModuleName(currentItem) });
                }

                return new SelectList(items, "Value", "Text");
            }
        }

        /// <summary>
        /// SPÄTER NICHT MEHR BEARBEITBAR, wenn einmal angelegt.
        /// Die ausgewählte Dynamische DatentypId, gehört zur Liste mit DynamicDataTypes
        /// </summary>
        [Required]
        public int DynamicDataTypeId { get; set; }

        /// <summary>
        /// Die Auflistung der zur Verfügung stehenden Dynamischen Datentypen aus einem Enum
        /// </summary>
        [Display(Name = "DynamicDataTypeRESX", ResourceType = typeof(AdminViews))]
        public IEnumerable<SelectListItem> DynamicDataTypes
        {
            get
            {
                //Aus dem Enum mit den DynamicDataTypes die passenden Listenteinträge machen
                List<SelectListItem> items = new List<SelectListItem>();
                foreach (string value in Enum.GetNames(typeof(EFDynamicDataTypes)))
                {
                    EFDynamicDataTypes currentItem = (EFDynamicDataTypes)Enum.Parse(typeof(EFDynamicDataTypes), value);
                    items.Add(new SelectListItem { Value = ((int)currentItem).ToString(), Text = EFDynamicDataType.GetDynamicDataTypeName(currentItem) });
                }

                return new SelectList(items, "Value", "Text");
            }
        }

        /// <summary>
        /// Die ausgewählte Dynamische DynamicDataTypeCategoryId, gehört zur Liste mit DynamicDataTypeCategories
        /// </summary>
        [Required]
        public int DynamicDataTypeCategoryId { get; set; }

        /// <summary>
        /// Die Auflistung der zur Verfügung stehenden Dynamischen Kategorien. Jeder Eintrag muss einer Kategorie zugeordnet werden, diese wird dann
        /// beim Anzeigen der einzelnen Werte für die ausgewählte Kategorie über den Werten angezeigt.
        /// </summary>
        [Display(Name = "DynamicDataTypesCategoryRESX", ResourceType = typeof(AdminViews))]
        public IEnumerable<SelectListItem> DynamicDataTypeCategories
        {
            get
            {
                List<SelectListItem> items = new List<SelectListItem>();
                //Alle im System hinterlegten Dynamischen DataType Kategorien anzeigen
                var categories = from eDynamicDataCategories in CurrentHttpContext.GetDataModel().EFCategoryMenge.OfType<DynamicDataTypeCategory>() select eDynamicDataCategories;
                foreach (DynamicDataTypeCategory eValue in  categories)
                {
                    items.Add(new SelectListItem { Value = eValue.ID.ToString(), Text = eValue.Name });
                }

                return new SelectList(items, "Value", "Text");
            }
        }
    }
}